

import { EnumManager_blxf } from "../Manager/EnumManager";
import { ConfigModule_blxf } from "../Module/ConfigModule";
import { LoadModule_blxf } from "../Module/LoadModule";
import { UtilsModule_blxf } from "../Module/UtilsModule";

/** 字体大小 */
enum FontSize {
    NONE    = 0,
    TITLE   = 40,
    CONTENT = 20,
    BUTTON  = 25,
};

/** 字体颜色 */
enum FontColor {
    // NONE  = new cc.Color(255, 255, 255),
    // TITLE = new cc.Color(250, 212, 7)
};

/** 字体库类型 */
enum FontFile {
    NONE      = 0,
    TTF       = 1,
    FNT       = 2,
};

/** 字体描边 */
enum FontOutline {
    NONE  = 0,
    WHITE = 1,
    BLUE  = 2,
    YELLOW= 3,

    COLOR1 = 101,

    COLOR2 = 102,

    EXTRA_201 = 201,
    EXTRA_202 = 202,
    EXTRA_203 = 203,
    /** 货币不足 */
    EXTRA_204 = 204,

};


// /** 字体缓存 */
// enum CachMode {
//     NONE   = cc.CacheMode.NONE,
//     BITMAP = cc.CacheMode.NONE,
//     CHAR   = cc.CacheMode.CHAR,
// };



const {ccclass, property} = cc._decorator;

/**
 * 文本组件
 */
@ccclass
export default class BaseLabel_blxf extends cc.Label {
    // fonteOutline : { type: FontOutline, tooltip: '字体描边颜色', default: FontOutline.NONE },
    // isLabelOutline: false,

    @property({ tooltip: '字体库类型' })
    fontFile : FontFile = FontFile.TTF;

    @property({ type: cc.Label, tooltip: '字体大小类型' })
    fontType : cc.Label = null;

    @property({ tooltip: '是否加描边' })
    isLabelOutline: boolean = false;

    @property({ tooltip: '字体描边颜色' })
    fontOutline: FontOutline = FontOutline.NONE

    @property({ tooltip: '是否是纯数字' })
    _isNumber: boolean = false;


    // LIFE-CYCLE CALLBACKS:

    onLoad () {
        // // 启用黑体
        // this.enableBold = false;
        // // 竖直居中
        // this.verticalAlign = 1;
        // // 是否使用默认字体
        // this.useSystemFont = false;

        // // if (this.isEditorPage()) return;

        this.setFont_blxf();
        // this.setFontColor();
        // this.setFontSize();
        // this.setCacheMode();
        this.addLabelOutline_blxf();

        this.scheduleOnce(()=>{
            this.setText_blxf( this.string );
        })
    }

    start () {
        // if (this.isEditorPage()) return;
        // this.onUpdateY();
    }

    // update (dt) {}
    
    update (dt) {

    }

    /**
     * 设置文本内容
     */
    setText_blxf ( text: string, outlineWidth: number = 0 ) {
        let _isCheck = this.fontFile == FontFile.FNT;
        let { languageType } = ConfigModule_blxf.instance;
        if ( languageType == 2 && !_isCheck ) {
            text = window['Chinese'].s2t( text );
        }

        this.string = text;

        this.isLabelOutline && outlineWidth && this.updateOutlineWidth_blxf( outlineWidth );
    };

    /**
     * 更新描边宽度
     * @param width 宽度
     * @param n 递归次数
     */
    updateOutlineWidth_blxf ( width: number = 2, n: number = 0 ) {
        let _labelOutline = this.node.getComponent(cc.LabelOutline);
        if ( !_labelOutline ) {
            if ( n > 3 ) return;
            n += 1;
            return this.scheduleOnce(()=>{ this.updateOutlineWidth_blxf( n )});
        }

        _labelOutline.width = width;
    }

    /**
     * 设置文本字体
     */
    setFont_blxf () {
        // if (this.fontFile == FontFile.WHITE_FNT) {
        //     this.fontFile = FontFile.TTF;
        // }
        // if ( this._fontFile == FontFile.NONE ) return;

        // this._fontFile = this.fontFile;
        // this._fontFile = FontFile.TTF;
        
        let { FONT_FONT_1, FONT_COUPLET, FONT_COUPLET_HANT } = EnumManager_blxf.gameFontType;
        let _fontFile: string = FONT_FONT_1;

        // // if ( Config.fontType == 2 ) this._fontFile = null;
        let _isHant = UtilsModule_blxf.instance.isTraditionalChinese_blxf();
        switch ( this.fontFile ) {
            case FontFile.FNT: _fontFile = /*_isHant ? FONT_COUPLET_HANT : */FONT_COUPLET; break;
            default          : _fontFile = FONT_FONT_1 ; break;
        }

        // LoadModule_blxf.instance.LoadFont_blxf( this, _fontFile );
    }

    // 添加描边
    addLabelOutline_blxf () {
        // if (this.isEditorPage()) return;
        let labelOutline = this.node.getComponent(cc.LabelOutline);

        if ( !this.isLabelOutline ) {
            labelOutline && labelOutline.destroy();
            return;
        }

        let width = 2;
        let outlineColor = new cc.Color(0, 0, 0);
        if ( this.fontOutline == FontOutline.YELLOW ) {
            width = 5;
            outlineColor = new cc.Color(196, 39, 20);
        }
        if ( this.fontOutline == FontOutline.COLOR1 ) {
            width = 5;
            outlineColor = new cc.Color(155, 82, 33);
        }
        // 红底标题
        if ( this.fontOutline == FontOutline.COLOR2 ) {
            width = 6;
            outlineColor = new cc.Color(116, 53, 53);
        }
        
        switch ( this.fontOutline ) {
            case FontOutline.EXTRA_201: width = 2, outlineColor = new cc.Color( 115, 74, 59 ); break;
            case FontOutline.EXTRA_202: width = 2, outlineColor = new cc.Color( 156, 70, 0 ); break;
            case FontOutline.EXTRA_203: width = 2, outlineColor = new cc.Color( 255, 255, 255 ); break;
            case FontOutline.EXTRA_204: width = 4, outlineColor = new cc.Color( 52, 35, 25 ); break;
        }

        // if (this.fontType == FontSize.TITLE) width = 2.5;
        if (labelOutline) {
            labelOutline.width = width;
            labelOutline.color = outlineColor || new cc.Color(0, 0, 0);
            return;
        }

        this.node.addComponent(cc.LabelOutline);
        labelOutline = this.node.getComponent(cc.LabelOutline);
        labelOutline.width = width;
        labelOutline.color = outlineColor || new cc.Color(0, 0, 0);
    }

    // /**
    //  * 设置文本颜色
    //  */
    // setFontColor () {
    //     if (this.fontType == FontSize.NONE) return;
    //     let color = null;
    //     if (this.fontType == FontSize.TITLE) color = FontColor.TITLE;
    //     if (!color) return;
    //     this.node.color = color;
    // },

    // /**
    //  * 设置缓存模式
    //  * @param cacheMode 0: NONE, 1: BITMAP, 2: CHAR
    //  */
    // setCacheMode (cacheMode = 0) {
    //     let isApp = this.isAndroidAndIos();
    //     let isWechat = this.isWechatGame();
    //     if (isApp) cacheMode = 0;
    //     if (isWechat) cacheMode = 0;
    //     if (this.isNumber && isWechat) cacheMode = 2;
    //     this.cacheMode = cacheMode;
    //     this.node.active = false;
    //     this.node.active = true;
    // },

    // /**
    //  * 设置字体大小
    //  */
    // setFontSize () {
    //     // 未选择字体大小类型，默认组件上字体大小
    //     if (this.fontType == FontSize.NONE) return;

    //     this.fontSize = this.fontType;
    //     this.lineHeight = this.fontType + 10;
    // },

    // // 获取单个文字宽度
    // onBaseWidth () {
    //     let _width = this.fontSize;

    //     let labelOutline = this.node.getComponent(cc.LabelOutline);
    //     if (labelOutline) _width += labelOutline.width;

    //     return _width;
    // },

    // /** 检测是否超屏换行 */
    // onCheckOverflow ( maxW, flag ) {
    //     let _text = this.string;
    //     let _baseFontW = this.onBaseWidth();

    //     let _maxNum = Math.floor(maxW / _baseFontW);
    //     let _isOverflow = _text.length > _maxNum;
    //     if ( !_isOverflow && !flag ) return;

    //     if ( !flag ) {
    //         this.overflow = 3;
    //         this.node.width = maxW;
    //     }

    //     return flag ? { _isOverflow, _maxNum } : _isOverflow;
    // }

    // 更新y坐标
    onUpdateY () {
        // if (this._fontFile == FontFile.FNT || this._fontFile == FontFile.WHITE_FNT) {
        //     let addY = 2;
        //     // if (this.isNumber) addY = 2;
        //     if (this.fontType == FontSize.TITLE) addY = 5;
        //     if (this._fontFile == FontFile.WHITE_FNT) addY = 6;
        //     this.node.y += addY;
        // }
    }

    // // 是否是APP
    // isAndroidAndIos () {
    //     let isIos = cc.sys.platform == cc.sys.OS_IOS;
    //     let isMacos = cc.sys.platform == cc.sys.MACOS;
    //     let isAndroid = cc.sys.platform == cc.sys.ANDROID;
    //     return isIos || isMacos || isAndroid;
    // }

    // 本地或微信小游戏
    isWechatGame () {
        let isWechat = cc.sys.platform == cc.sys.WECHAT_GAME;
        let isBrowser = cc.sys.platform == cc.sys.DESKTOP_BROWSER;
        return isWechat || isBrowser;
    }

    isEditorPage () {
        return cc.sys.platform == cc.sys.EDITOR_PAGE;
    }
}
